from functools import reduce
import functools

def powerFun(x):
    return x * x

def sum(x, y):
    return x + y

# 使用高阶函数map
newList = map(powerFun, [x for x in range(11)])
print("使用高阶函数Map:")
for x in iter(newList):
    print(x)

# 使用高阶函数reduce  lambda表达式 当函数只有一个return语句的缩写
result = reduce(lambda x, y: x+y, [x for x in range(11)])
print("高阶函数reduce处理的结果为：", result)


############## map 和 filter 高阶函数返回的结果是一个迭代器，需要显示的进行转换成一个list才能打印出元素

# 使用高阶函数filter()
needFilterList = [x for x in range(11)]
filterList = filter(lambda x:x%2==1, needFilterList)
print("过滤后的元素为：", list(filterList))

# 判断字符串是否为空 
def notEmpty(s):
    return s and s.strip()

needFilterStringList = ['shenzhen', ' ', 'beijing', 'shah']
print("去掉空的元素之后的列表：", list(filter(notEmpty, needFilterStringList)))



# 使用高阶函数sort()进行排序
p = sorted([23, 34, 3, -36, -29], key = abs)
print(p)

## 这种称为闭包的程序结构有着极大的威力
# 每次调用都会返回一个新的函数，即使传入的参数一样
print("#######################返回函数####################")
def lazySum(*args):
    def sum():
        result = 0
        for n in args:
            print(n)
            result = result + n
        return result
    return sum

f = lazySum(*[x for x in range(11)])
f2 = lazySum(*[x for x in range(11)])
print("高阶函数，返回函数的函数，在需要是在执行：", f())
print("入参一样的两个返回函数是否一样：", f == f2)


# 装饰器 也是一种高阶函数  对传入的函数对象进行装饰，返回一个装饰好的函数
def log(func):
    def wrapper(*args, **kw):
        print("call %s():" % func.__name__)
        return func(*args, **kw)
    return wrapper

@log
def now():
    print("2021--4-26 11:30:00")


print(now())

## 偏函数

int2 = functools.partial(int, base = 2)
print(type(int2))
print("将一个数据转换为二进制数：", int2('101001'))